package com.li.reflect;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

public class Test4 {

    /*
     * 需求：
     *  假设你现在已知一下信息：
     *      1.类名：com.li.reflect.User
     *      2.这个类符合JavaBean规范。属性私有化，对外提供Getter、Setter方法
     *      3.你还知道这个类当中有一个属性，属性名叫 age
     *      4.并且你还知道 age 属性的类型是int 类型
     *
     *  请使用反射机制调用set方法，给User对象的age属性赋值。
     */
    public static void main(String[] args) throws Exception{

        String className = "com.li.reflect.User";
        String propertyName = "age";

        //获取类
        Class<?> clazz = Class.forName(className);

        //获取方法
        String setMethodName = "set" + propertyName.toUpperCase().charAt(0) + propertyName.substring(1);
        //根据属性名获取属性类型
        Field field = clazz.getDeclaredField(propertyName);
        Method setMethod = clazz.getDeclaredMethod(setMethodName, field.getType());

        //获取对象
        Constructor<?> constructor = clazz.getConstructor();
        Object instance = constructor.newInstance();

        //调用方法
        setMethod.invoke(instance, 18);

        //打印对象
        System.out.println(instance);

    }
}
